2026-10-15T03:47:03.2669568Z ##[group]Run npm run test:deploy
2026-10-15T03:47:03.2670346Z [36;1mnpm run test:deploy[0m
2026-10-15T03:47:03.2670361Z shell: /usr/bin/bash -e {0}
2026-10-15T03:47:03.2670374Z env:
2026-10-15T03:47:03.2670384Z   CARGO_TERM_COLOR: never
2026-10-15T03:47:03.2670471Z   CLOUDFLARE_ACCOUNT_ID: 1e6f2cffa3f445920836e8ebe446bb58
2026-10-15T03:47:03.2670483Z   WRANGLER_SEND_METRICS: false
2026-10-15T03:47:03.2670494Z ##[endgroup]
2026-10-15T03:47:03.3528230Z 
2026-10-15T03:47:03.3528351Z > test:deploy
2026-10-15T03:47:03.3528374Z > node --test "scripts/deploy/*.test.mjs"
2026-10-15T03:47:03.3528384Z 
2026-10-15T03:47:03.4453844Z ✔ a release's version bump keeps the Rust caches' key, a new dependency changes it (2.507292ms)
2026-10-15T03:47:03.4457086Z ✔ the toolchain is read from rustc -V (0.197171ms)
2026-10-15T03:47:03.4460128Z ✔ the CLI's builder image is pinned, and keys its cache by its digest (0.19136ms)
2026-10-15T03:47:03.4470168Z ✔ a unit's hash is read from its files and folders (0.19323ms)
2026-10-15T03:47:03.4470241Z ✔ only the units the build did not use are pruned (1.921211ms)
2026-10-15T03:47:04.5574018Z error: no matching package named `base64` found
2026-10-15T03:47:04.5577157Z location searched: crates.io index
2026-10-15T03:47:04.5577259Z required by package `g1t-api v0.1.0 (/home/runner/work/repo/apps/api)`
2026-10-15T03:47:04.5577326Z note: offline mode (via `--offline`) can sometimes cause surprising resolution failures
2026-10-15T03:47:04.5577374Z help: if this error is too confusing you may wish to retry without `--offline`
2026-10-15T03:47:04.7475166Z ✔ the manifest matches every wrangler config in the repository (23.595611ms)
2026-10-15T03:47:04.7476744Z ✔ every wrangler.jsonc is found, and only checked-in ones (16.986984ms)
2026-10-15T03:47:04.7478106Z ✔ problems are found: an unlisted config, a later-stage binding, a wrong database, an unnamed KV (18.263196ms)
2026-10-15T03:47:04.7478928Z ✔ stages follow bindings: nothing binds to a unit that ships after it (0.27459ms)
2026-10-15T03:47:04.7483678Z ✔ inside a stage, a Worker that does not exist yet goes before those bound to it (0.42857ms)
2026-10-15T03:47:04.7537695Z ✔ Rust workers build with the shared script and the same wasm-opt level (0.45172ms)
2026-10-15T03:47:04.7537772Z ✔ shared crates and packages are read from workspace metadata (0.18244ms)
2026-10-15T03:47:04.7537843Z ✔ the runner's image is built from the runner crate and what it uses, on the base its lock names (0.32641ms)
2026-10-15T03:47:04.7537889Z ✔ services/runner/base.json records the base its folder builds (6.786016ms)
2026-10-15T03:47:04.7537934Z ✔ an image's hash ignores line endings, and its tags say what they are (77.165645ms)
2026-10-15T03:47:04.7537978Z ✔ only the lockfile entries the runner is built from name its image (0.270771ms)
2026-10-15T03:47:04.7538019Z ✔ the runner's deploy config names its image by reference, beside its wrangler.jsonc (16.616584ms)
2026-10-15T03:47:04.7538171Z ✔ the registry is asked for an image's manifest, without Docker (0.663381ms)
2026-10-15T03:47:04.7538214Z ✔ a push counts only when it ends with a digest, and is tried again (0.534251ms)
2026-10-15T03:47:04.7538252Z ✔ a static Linux binary is told from a dynamic one (0.670071ms)
2026-10-15T03:47:04.7538308Z ﹣ path dependencies agree with Cargo's own resolved graph (866.335008ms) # cargo metadata could not resolve offline
2026-10-15T03:47:04.7538356Z ✔ every import that leaves a unit's folder is covered by its dependencies or inputs (49.899453ms)
2026-10-15T03:47:04.7538396Z ✔ a shared crate's change reaches every unit built from it, and no other (0.48899ms)
2026-10-15T03:47:04.7538434Z ✔ a shared package's change reaches what imports it (0.17441ms)
2026-10-15T03:47:04.7538474Z ✔ a crate's tests, benches and examples deploy nothing (0.342791ms)
2026-10-15T03:47:04.7538515Z ✔ a Rust file compiled only for tests is found from what declares it (0.88207ms)
2026-10-15T03:47:04.7538552Z ✔ this repository's test-only sources are read from git (126.994509ms)
2026-10-15T03:47:04.7538593Z ✔ decide: a change only to tests deploys nothing (0.84156ms)
2026-10-15T03:47:04.7538629Z ✔ own folders, declared inputs and root files (0.33683ms)
2026-10-15T03:47:04.7538669Z ✔ a Cargo.lock change reaches only crates that use what changed (0.32954ms)
2026-10-15T03:47:04.7538706Z ✔ a package-lock change reaches through workspace links (0.37643ms)
2026-10-15T03:47:04.7538741Z ✔ decide: changed units deploy, others wait, unknown ones deploy (0.237701ms)
2026-10-15T03:47:04.7538782Z ✔ decide: --force deploys unchanged units; a commit missing from history deploys (0.1149ms)
2026-10-15T03:47:04.7539016Z ✔ decide: Cargo.lock counts only where it reaches (0.32501ms)
2026-10-15T03:47:04.7539058Z ✔ decide: the runner's image rebuilds only when what it is built from changed (0.15758ms)
2026-10-15T03:47:04.7539098Z ✔ the plan as data: migrations, and each stage's units in jobs that share a build (0.794371ms)
2026-10-15T03:47:04.7539134Z ✔ units are picked by short name, folder or Worker name (0.3549ms)
2026-10-15T03:47:04.7539172Z ✔ a CI job installs only what its units need (0.682151ms)
2026-10-15T03:47:04.7539208Z ✔ a deploy is annotated with its commit, and read back (0.20674ms)
2026-10-15T03:47:04.7539250Z ✔ the live commit: the live version's, looking through secret changes (0.32245ms)
2026-10-15T03:47:04.7539288Z ✔ Wrangler's output: pending migrations and the version a deploy made (0.296111ms)
2026-10-15T03:47:04.7539325Z ✔ the API's answers: the live commit as Wrangler's would give it (0.86352ms)
2026-10-15T03:47:05.2471720Z ✔ the API's answers: a Worker never deployed, and a refusal, never throw (501.159838ms)
2026-10-15T03:47:05.2471857Z ✔ the API is used only with the token Wrangler would be given (0.35867ms)
2026-10-15T03:47:05.2471916Z ✔ pending migrations: the folder's files less the names in d1_migrations (1.216921ms)
2026-10-15T03:47:05.2977362Z ✔ the pool runs everything, no more than its limit at once (15.257883ms)
2026-10-15T03:47:05.2977501Z ✔ self-hosting builds every Rust service the manifest says it runs (0.480641ms)
2026-10-15T03:47:05.2977567Z ✔ the self-hosting architecture page names every unit (0.21655ms)
2026-10-15T03:47:05.2989113Z ✔ the architecture's services page names every unit, with the services it binds to (3.822053ms)
2026-10-15T03:47:05.2995335Z ✔ resolveStack works on a manifest with no workspace crates or packages (1.868062ms)
2026-10-15T03:47:05.2995416Z ✔ decide: a commit older than what runs is never deployed by accident, even forced; --rollback means it (0.18659ms)
2026-10-15T03:47:05.2995486Z ✔ a deploy by hand reports to the repository on g1t, and a workflow's does not (1.370941ms)
2026-10-15T03:47:05.3019225Z ✔ a failed wrangler command is reported by its error, not its trace (0.19059ms)
2026-10-15T03:47:05.4277158Z ✔ Cloudflare failing is tried again; a mistake in what is deployed is not (0.327901ms)
2026-10-15T03:47:05.4277300Z ✔ sandboxes roll over at once when their image or container settings changed, and not otherwise (0.205541ms)
2026-10-15T03:47:05.4277370Z ✔ the deploy tool itself parses: a test that never imports it would not notice (26.553483ms)
2026-10-15T03:47:05.5584347Z ✔ the statements are all there (0.86604ms)
2026-10-15T03:47:05.5615175Z ✔ twenty invites each: the twenty-first is refused in the statement that writes (33.375359ms)
2026-10-15T03:47:05.5615287Z ✔ revoking an unused invite gives it back; an expired one never counted (58.35947ms)
2026-10-15T03:47:05.5615339Z ✔ a used invite is spent: revoking it does nothing and it still counts (28.975485ms)
2026-10-15T03:47:05.5615379Z ✔ a pending invite for the same address is found; a revoked one is not (27.253803ms)
2026-10-15T03:47:05.5615422Z ✔ staff grants add to the twenty and can take some back (31.503957ms)
2026-10-15T03:47:05.5615507Z ✔ signing up from the link spends the invite once and records who invited whom (25.643132ms)
2026-10-15T03:47:05.6152576Z ✔ a body that broke off is worth another try, a lockfile out of step is not (1.057251ms)
2026-10-15T03:47:05.6159498Z ✔ an install that ends without saying why, or stalls, is tried again (0.12594ms)
2026-10-15T03:47:05.6162356Z ✔ a dropped connection is tried again until the install passes (0.730071ms)
2026-10-15T03:47:05.6170965Z ✔ a real error fails at once (0.195761ms)
2026-10-15T03:47:05.6175428Z ✔ it gives up after its tries, with npm's exit code (0.19499ms)
2026-10-15T03:47:05.6176425Z ✔ a stalled install is run again (0.15362ms)
2026-10-15T03:47:05.7349394Z ✔ webhooks: the hourly purge deletes old deliveries by time (1.583091ms)
2026-10-15T03:47:05.7353865Z ✔ billing: this month's users are read from an index, not the ledger (43.722017ms)
2026-10-15T03:47:05.7354213Z ✔ events: a repository's events of one type, newest first, page by page (3.078792ms)
2026-10-15T03:47:05.7354765Z ✔ actions: a self-hosted runner's poll finds queued jobs by namespace, whatever its case (13.628402ms)
2026-10-15T03:47:05.7356595Z ✔ chat: a channel's messages and a thread's replies, newest first, page by page (2.548282ms)
2026-10-15T03:47:05.7357269Z ✔ chat: the sidebar's unread messages are read from each channel's index, after the last read (2.299122ms)
2026-10-15T03:47:05.7358302Z ✔ chat: a page's reactions are read by message, and a workspace's emoji by name (2.384162ms)
2026-10-15T03:47:05.8141807Z ✔ the runner's layer is the binary alone, at its path and mode, owned by root (3.627123ms)
2026-10-15T03:47:05.8149235Z ✔ the layer and entrypoint are what services/runner/Dockerfile builds (0.38666ms)
2026-10-15T03:47:05.8149334Z ✔ the config is the base's, with the layer, the entrypoint and no inherited command (0.810531ms)
2026-10-15T03:47:05.8149402Z ✔ the manifest names the base's layers, then the binary's, in the base's format (0.24654ms)
2026-10-15T03:47:05.8164044Z ✔ image references and bearer challenges are read (0.504801ms)
2026-10-15T03:47:05.8166455Z ✔ the runner's image is made in the registry from the base's manifest and one new layer, pulling none of the base (21.330688ms)
2026-10-15T03:47:05.8167066Z ✔ a base that is not where it should be, or not what base.json says, stops it (1.025841ms)
2026-10-15T03:47:05.8167711Z ✔ a registry that asks for a bearer token is given the one its realm trades the credentials for (1.377851ms)
2026-10-15T03:47:05.8675893Z scheduler: g1t-webhooks (* * * * *) is still running from the last time; skipped
2026-10-15T03:47:05.8876759Z scheduler: g1t-webhooks (* * * * *): 200 {"outcome":"exception"}
2026-10-15T03:47:05.8899554Z ✔ fields read numbers, ranges, lists and steps (1.275461ms)
2026-10-15T03:47:05.8905687Z ✔ the services' crons match when hosted g1t's would fire (1.059141ms)
2026-10-15T03:47:05.8910804Z ✔ what is due is each matching cron of each service (0.35951ms)
2026-10-15T03:47:05.8911064Z ✔ a run asks Wrangler for the handler, and a slow one is not doubled (20.815428ms)
2026-10-15T03:47:05.9607591Z ✔ a deploy is announced to status.g1t.sh with the token, and without one nothing is sent (23.01694ms)
2026-10-15T03:47:05.9618823Z ✔ an announcement that fails is a warning, never a failed deploy (0.7365ms)
2026-10-15T03:47:05.9624238Z ✔ the stages run inside the window: started before, finished after, even when they throw; a dry run says nothing (0.718901ms)
2026-10-15T03:47:05.9625626Z ✔ deploy.mjs announces every deploy, and the workflow passes it the token (0.39242ms)
2026-10-15T03:47:05.9714092Z ℹ tests 92
2026-10-15T03:47:05.9714532Z ℹ suites 0
2026-10-15T03:47:05.9746082Z ℹ pass 91
2026-10-15T03:47:05.9746115Z ℹ fail 0
2026-10-15T03:47:05.9746127Z ℹ cancelled 0
2026-10-15T03:47:05.9746137Z ℹ skipped 1
2026-10-15T03:47:05.9746147Z ℹ todo 0
2026-10-15T03:47:05.9746155Z ℹ duration_ms 2585.870234
